<?php if ( ! defined('ABS_PATH')) exit('ABS_PATH is not loaded. Direct access is not allowed.');

  

    /**
     * This class represents a utility to load and resize images easily.
     */
    class ImageResizer {

        public static function fromFile($imagePath) {
            return new ImageResizer($imagePath);
        }

        private $im;

        private function __construct($imagePath) {
            if(!file_exists($imagePath)) throw new Exception("$imagePath does not exist!");
            if(!is_readable($imagePath)) throw new Exception("$imagePath is not readable!");

            $content = file_get_contents($imagePath);
            $this->im = imagecreatefromstring($content);

            return $this;
        }

        public function __destruct() {
            imagedestroy($this->im);
        }

        public function resizeToMax($size) {
            $w = imagesx($this->im);
            $h = imagesy($this->im);

            if($w >= $h) {
                //$newW = $size;
                $newW = ($w > $size)? $size : $w;
                $newH = $h * ($newW / $w);
            } else {
                //$newH = $size;
                $newH = ($h > $size)? $size : $h;
                $newW = $w * ($newH / $h);
            }

            $newIm = imagecreatetruecolor($newW, $newH);
            imagealphablending($newIm, false);
            $colorTransparent = imagecolorallocatealpha($newIm, 255, 255, 255, 127);
            imagefill($newIm, 0, 0, $colorTransparent);
            imagesavealpha($newIm, true);
            imagecopyresized($newIm, $this->im, 0, 0, 0, 0, $newW, $newH, $w, $h);
            imagedestroy($this->im);

            $this->im = $newIm;

            return $this;
        }

        public function resizeTo($width, $height) {
            $w = imagesx($this->im);
            $h = imagesy($this->im);

            if(($w/$h)>=($width/$height)) {
                //$newW = $width;
                $newW = ($w > $width)? $width : $w;
                $newH = $h * ($newW / $w);
            } else {
                //$newH = $height;
                $newH = ($h > $height)? $height : $h;
                $newW = $w * ($newH / $h);
            }

            $newIm = imagecreatetruecolor($width,$height);//$newW, $newH);
            imagealphablending($newIm, false);
            $colorTransparent = imagecolorallocatealpha($newIm, 255, 255, 255, 127);
            imagefill($newIm, 0, 0, $colorTransparent);
            imagesavealpha($newIm, true);
            imagecopyresampled($newIm, $this->im, (($width-$newW)/2), (($height-$newH)/2), 0, 0, $newW, $newH, $w, $h);
            imagedestroy($this->im);

            $this->im = $newIm;

            return $this;
        }

        public function saveToFile($imagePath) {
            if(file_exists($imagePath) && !is_writable($imagePath)) throw new Exception("$imagePath is not writable!");

            imagejpeg($this->im, $imagePath);
        }

        public function show() {
            header('Content-Disposition: Attachment;filename=image.png');
            header('Content-type: image/png');
            imagepng($this->im);
        }

    }

?>